 package com.rt.shop.pay.yikatong.util;
 
 import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;

import javax.crypto.Cipher;

import com.rt.shop.pay.alipay.util.Base64;
 
 public class RSA
 {
   public static final String SIGN_ALGORITHMS = "SHA1WithRSA";
 
   public static String sign(String content, String privateKey, String input_charset)
   {
     try
     {
       PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec(
         Base64.decode(privateKey));
       KeyFactory keyf = KeyFactory.getInstance("RSA");
       PrivateKey priKey = keyf.generatePrivate(priPKCS8);
 
       Signature signature = 
         Signature.getInstance("SHA1WithRSA");
 
       signature.initSign(priKey);
       signature.update(content.getBytes(input_charset));
 
       byte[] signed = signature.sign();
 
       return Base64.encode(signed);
     } catch (Exception e) {
       e.printStackTrace();
     }
 
     return null;
   }
 
   public static boolean verify(String content, String sign, String ali_public_key, String input_charset)
   {
     try
     {
       KeyFactory keyFactory = KeyFactory.getInstance("RSA");
       byte[] encodedKey = Base64.decode(ali_public_key);
       PublicKey pubKey = keyFactory
         .generatePublic(new X509EncodedKeySpec(encodedKey));
 
       Signature signature = 
         Signature.getInstance("SHA1WithRSA");
 
       signature.initVerify(pubKey);
       signature.update(content.getBytes(input_charset));
 
       boolean bverify = signature.verify(Base64.decode(sign));
       return bverify;
     }
     catch (Exception e) {
       e.printStackTrace();
     }
 
     return false;
   }
 
   public static String decrypt(String content, String private_key, String input_charset)
     throws Exception
   {
     PrivateKey prikey = getPrivateKey(private_key);
 
     Cipher cipher = Cipher.getInstance("RSA");
     cipher.init(2, prikey);
 
     InputStream ins = new ByteArrayInputStream(Base64.decode(content));
     ByteArrayOutputStream writer = new ByteArrayOutputStream();
 
     byte[] buf = new byte[''];
     int bufl;
     while ((bufl = ins.read(buf)) != -1)
     {
       //int bufl;
       byte[] block = null;
 
       if (buf.length == bufl) {
         block = buf;
       } else {
         block = new byte[bufl];
         for (int i = 0; i < bufl; i++) {
           block[i] = buf[i];
         }
       }
 
       writer.write(cipher.doFinal(block));
     }
 
     return new String(writer.toByteArray(), input_charset);
   }
 
   public static PrivateKey getPrivateKey(String key)
     throws Exception
   {
     byte[] keyBytes = Base64.decode(key);
 
     PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
 
     KeyFactory keyFactory = KeyFactory.getInstance("RSA");
 
     PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
 
     return privateKey;
   }
 }


 
 
 